#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
使用PyInstaller打包exe文件
"""

import subprocess
import sys
import os
import shutil

def check_python_version():
    """检查Python版本"""
    version = sys.version_info
    if version.major < 3 or (version.major == 3 and version.minor < 6):
        print("错误: 需要Python 3.6或更高版本")
        return False
    print(f"Python版本: {version.major}.{version.minor}.{version.micro}")
    return True

def install_pyinstaller():
    """安装PyInstaller"""
    try:
        print("正在安装PyInstaller...")
        subprocess.check_call([sys.executable, "-m", "pip", "install", "pyinstaller"])
        print("PyInstaller安装成功")
        return True
    except subprocess.CalledProcessError as e:
        print(f"PyInstaller安装失败: {e}")
        return False

def clean_build_dirs():
    """清理构建目录"""
    dirs_to_clean = ["build", "dist", "__pycache__"]
    for dir_name in dirs_to_clean:
        if os.path.exists(dir_name):
            try:
                print(f"清理目录: {dir_name}")
                shutil.rmtree(dir_name)
            except PermissionError:
                print(f"警告: 无法删除目录 {dir_name}，可能正在被使用")
                # 尝试删除目录中的文件，保留目录结构
                if dir_name == "dist":
                    for file in os.listdir(dir_name):
                        file_path = os.path.join(dir_name, file)
                        try:
                            if os.path.isfile(file_path):
                                os.remove(file_path)
                                print(f"已删除文件: {file}")
                        except PermissionError:
                            print(f"警告: 无法删除文件 {file}")
            except Exception as e:
                print(f"清理目录 {dir_name} 时出错: {e}")

def build_exe():
    """打包exe文件"""
    try:
        print("开始打包exe文件...")
        
        # PyInstaller命令参数
        cmd = [
            sys.executable, "-m", "PyInstaller",
            "--onefile",  # 打包成单个exe文件
            "--windowed",  # 不显示控制台窗口
            "--name=SPE2TIF_Generator",  # exe文件名
            "--clean",  # 清理临时文件
            "--noconfirm",  # 不询问覆盖
            "spe2tif_generator.py"
        ]
        
        # 执行打包命令
        subprocess.check_call(cmd)
        
        print("exe文件打包成功！")
        return True
    except subprocess.CalledProcessError as e:
        print(f"打包失败: {e}")
        return False

def verify_exe():
    """验证exe文件是否生成"""
    exe_path = os.path.join("dist", "SPE2TIF_Generator.exe")
    if os.path.exists(exe_path):
        file_size = os.path.getsize(exe_path)
        print(f"exe文件生成成功: {exe_path}")
        print(f"文件大小: {file_size / 1024 / 1024:.2f} MB")
        return True
    else:
        print("错误: exe文件未生成")
        return False

def main():
    """主函数"""
    print("SPE to TIF 宏代码生成器 - 打包工具")
    print("=" * 50)
    
    # 检查Python版本
    if not check_python_version():
        return
    
    # 检查主程序文件是否存在
    if not os.path.exists("spe2tif_generator.py"):
        print("错误: 找不到spe2tif_generator.py文件")
        return
    
    # 清理旧的构建文件
    clean_build_dirs()
    
    # 安装PyInstaller
    if not install_pyinstaller():
        return
    
    # 打包exe
    if build_exe():
        if verify_exe():
            print("\n" + "=" * 50)
            print("打包完成！")
            print("exe文件位置: dist/SPE2TIF_Generator.exe")
            print("您可以直接运行这个exe文件")
        else:
            print("\n打包过程完成，但exe文件验证失败")
    else:
        print("\n打包失败，请检查错误信息")

if __name__ == "__main__":
    main() 